/*
 * @lc app=leetcode.cn id=459 lang=javascript
 *
 * [459] 重复的子字符串
 */

// @lc code=start
/**
 * @param {string} s
 * @return {boolean}
 */
var repeatedSubstringPattern = function (s) {
    let len = s.length
    if (s.substr(0, len >> 1) == s.substr(-(len >> 1)) && len % 2 == 0) {
        return true
    }
    for (let i = 3; i <= len; i++) {
        for (let x = 1; x <= (len / 3); x++) {
            if (s == s.substr(0, x).repeat(i)) {
                return true
            }
            if (i * x > len) break
        }

    }
    return false
};
// @lc code=end

repeatedSubstringPattern("ababababab")
var repeatedSubstringPattern = function (s) {
    let len = Math.floor(s.length / 2); // 子字符串一定不会大于一半，加这个限制条件
    for (let i = 0; i < len; i++) {
        if (Number.isInteger(s.length / (i + 1))) { // 判断是否能整除字符串长度，不能则不是重复子字符串
            let tmp = s.substr(0, i + 1);
            let j = i + 1;
            while (j < s.length) {
                if (tmp != s.substr(j, tmp.length)) break;
                j += tmp.length;
            }
            if (j == s.length) return true
        }
    }
    return false

};//循环子字符串长度并且一直分段比较直到末尾
var repeatedSubstringPattern = function (s) {
    let s1 = (s + s).slice(1, -1);
    return s1.indexOf(s) != -1;
};//双倍字符串法，比如字符串：S = acd，那么str = S + S = acdacd，acd移动的可能：cda，dac。其实都包含在了str中了。就像一个滑动窗口一开始acd(acd) ，移动一次cda, 移动两次dac。循环结束,如果S不由重复字符串组成，那么中间由S自身移动的元素不可能与位置移动过的S相等（可用反证法解方程证明），而如果有重复字符串组成，那么2s中间必可以组成之前的S。故这样证明。

